<?php

/**
 * php 模拟多态 Polym
 */

class Animal
{
    /**
     * 统一调用被重写方法
     * @param Animal $obj
     */
    public static function show(Animal $obj)
    {
        /**
         * Animal $obj 强制对象为Animal，调用 display 方法
         * 如果传入子类对象，则为子类
         */
        $obj->display();
    }

    public function display()
    {
        echo 'animal';
    }

}

class Dog extends Animal
{
    /**
     * 重写父类方法
     */
    public function display()
    {
        echo 'dog';
    }

}

class Cat extends Animal
{
    /**
     * 重写父类方法
     */
    public function display()
    {
        echo 'cat';
    }
}

// 父类方法统一调用：传入子类对象
Animal::show(new Cat()); // 会调用子类 Cat 的 display 方法 输出 cat
Animal::show(new Dog()); // 会调用子类 Dog 的 display 方法 输出 dog
